<?php


namespace app\common\business;


use app\common\lib\Snowflake;
use think\facade\Cache;

class Order extends BusBass
{
    public $model = null;

    public function __construct()
    {
        $this->model = new \app\common\model\mysql\Order();
    }

    /**
     * 提交订单
     * @param $data
     * @return array|bool|int
     * @throws \think\Exception
     */
    public function save($data)
    {
        //拿到订单号 使用雪花算法
        $workId = rand(1, 1023);  //机器号
        $orderId = Snowflake::getInstance()->setWorkId($workId)->Id();

        //获取购物车数据 从redis拿数据
        $catObj = new Cart();
        $result = $catObj->lists($data['user_id'], $data['ids']);
        if (!$result) {
            return false;
        }

        //拼接数据
        $newResult = array_map(function ($v) use ($orderId) {
            $v['sku_id'] = $v['id'];
            unset($v['id']);
            $v['order_id'] = $orderId;
            $v['hello'] = '我是数据';
            return $v;
        }, $result);


        //订单总价
        $price = array_sum(array_column($result, "total_price"));
        $orderData = [
            "user_id" => $data['user_id'],
            "order_id" => $orderId,
            "total_price" => $price,
            "address_id" => $data['address_id'],
        ];


        //开启事务
        $this->model->startTrans();
        try {
            //存入order 表
            $id = $this->add($orderData);
            if (!$id) {
                return 0;
            }
            // order_goods 表 新增
            $orderGoodsResult = (new \app\common\model\mysql\OrderGoods())->saveAll($newResult);


            // goods_sku 表 更新 库存减少
            $skuRes = (new GoodsSku())->updateStock($result);
            //goods 更新


            //在redis里删除购物车
            $catObj->deleteRedis($data['user_id'], $data['ids']);

            //提交事务
            $this->model->commit();

            // 把当前订单ID 放入延迟队列中， 定期检测订单是否已经支付 （因为订单有效期是20分钟，超过这个时间还没有支付的，
            // 我们需要把这个订单取消 ， 然后库存+操作） 第一个是key  第二个是失效时间 当前时间加上 失效的时间  第三成员
            try {
                Cache::zAdd(config("redis.order_status_key"), time() + config("redis.order_expire"), (string)$orderId);
            } catch (\Exception $e) {

            }

            //返回订单号
            return ['id' => (string)$orderId];

        } catch (\Exception $e) {
            //事务回滚
            $this->model->rollback();
            return false;
        }
    }


    //获取订单详情
    public function detail($data)
    {
        //user_id 订单id组合查询
        $condition = [
            "user_id" => $data['user_id'],
            "order_id" => $data['order_id'],
        ];
        try {
            $orders = $this->model->getByCondition($condition);
        } catch (\Exception $e) {
            $orders = [];
        }
        $orders = $orders->toArray();
        //数组转换  select查询出来是二维数组
        $orders = !empty($orders) ? $orders[0] : [];
        if (empty($orders)) {
            return [];
        }

        $orders['id'] = $orders['order_id'];
        $orders['consignee_info'] = "重庆市 渝中区 xxx";
        //根据order_id 查询 order_goods表信息数据
        $ordersGoods = (new OrderGoods())->getByOrderId($data['order_id']);
        $orders['malls'] = $ordersGoods;
        return $orders;

    }

    //延迟队列 获取mysql数据
    public function checkOrderStatus()
    {
        //redis获取0和当前时间的数据
        $result = Cache::store('redis')->zRangeByScore("order_status", 0, time(), ['limit' => [0, 10]]);

        if (empty($result) || empty($result[0])) {
            return false;
        }

        //把获取的过期数据 删掉
        try {
            $delRedis = Cache::store('redis')->Zrem("order_status", $result[0]);
        } catch (\Exception $e) {
            //记录日志
            $delRedis = "";
        }

        if ($delRedis) {
            echo "订单id:{$result[0]}在规定时间内没有完成支付 我们判定为无效订单删除".PHP_EOL;


        }


    }
}